package jdx_14_基于CAS的新锁;

import java.util.concurrent.Exchanger;

public class T12_TestExchanger {
    // Exchanger 交换器
    static Exchanger<String> exchanger = new Exchanger<>();

    public static void main(String[] args) {
        new Thread(()->{
            String s = "T1";
            try {
                s = exchanger.exchange(s); // 名称的交换数据
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("[线程名称]:"+Thread.currentThread().getName() + "\t[交换后的数据]:" + s);

        }, "t1").start();


        new Thread(()->{
            String s = "T2";
            try {
                s = exchanger.exchange(s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("[线程名称]:"+Thread.currentThread().getName() + "\t[交换后的数据]:" + s);

        }, "t2").start();
    }
}

/*
[原理]
(1)首先把 Exchanger 想象成一个容器，可以容纳两个需要交换的数据
(2)当线程1执行的时候把"T1"交给容器，并且执行exchange()，线程2也是如此
(3)交换器开始对这两个数据进行交换

[注意]
(1)如果只有一条线程执行了exchange()方法，那么Exchanger会阻塞线程直到第二条线程也执行exchange()为止
(2)数据交换结束之后(在代码中，等待交换结束之后，会有一个返回值，最后输出的数据是交换之后的结果)，两条线程继续执行
(3)交换数据只是发生在两两交换

[应用]
游戏人物之间交换装备

[补充]
乐观锁：CAS
分段锁：LongAdder ConcurrentHashMap
 */
